<?php

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

use Illuminate\Support\Facades\Cache;

Route::get('/test', function () {
    return view('test\extendstest');
});

//文件上传路由设置
Route::any('/upload', 'File\FileController@upload');

/*
 * Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);
 */
//get 方法，一个路径
Route::get('foo', function () {
    return 'Hello World';
});
//多个请求方法
Route::match(['get', 'post'], '/more', function () {
    return 'more request';
});
//所有请求方法
Route::any('/any', function () {
    return 'any request';
});
//路由参数
//路由参数总是通过花括号进行包裹，这些参数在路由被执行时会被传递到路由的闭包。路由参数不能包含 - 字符，需要的话可以使用 _ 替代。
Route::get('user/{id}', function ($id) {
    return 'User '.$id;
});

Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) {
    return $postId.$commentId;
});
//可选参数有时候可能需要指定可选的路由参数，这可以通过在参数名后加一个 ? 标记来实现，这种情况下需要给相应的变量指定默认值：
Route::get('user/{name?}', function ($name = null) {
    return $name;
});

Route::get('user/{name?}', function ($name = 'John') {
    return $name;
});
//正则约束可以使用路由实例上的 where 方法来约束路由参数的格式。where 方法接收参数名和一个正则表达式来定义该参数如何被约束：
Route::get('user/{name}', function ($name) {
    //
})->where('name', '[A-Za-z]+');

Route::get('user/{id}', function ($id) {
    //
})->where('id', '[0-9]+');

Route::get('user/{id}/{name}', function ($id, $name) {
    //
})->where(['id' => '[0-9]+', 'name' => '[a-z]+']);

//全局约束如果想要路由参数在全局范围内被给定正则表达式约束，可以使用 pattern 方法。在RouteServiceProvider 类的 boot 方法中定义约束模式：
/*
 * 全局约束请看文档
 */

//3、命名路由

Route::get('user/profile', function () {

})->name('profile');

Route::get('user/profile3', function () {
    $url = route('profile');
    return redirect()->route('profile');
});

Route::get('user/{id}/profile4', function ($id) {
    return $url = route('profile', ['id' => $id]);
})->name('profile');

Route::get('user/profile2', ['as' => 'profile2',function () {
    return 'my return profile ';
}]);

//4、路由群组
Route::group(['middleware' => 'auth'], function () {
    Route::get('/', function () {
        // 使用 Auth 中间件
    });

    Route::get('user/profile', function () {
        // 使用 Auth 中间件
    });
});

Route::group(['namespace' => 'Admin'], function(){
    // 控制器在 "App\Http\Controllers\Admin" 命名空间下
});
//子域名路由
Route::group(['domain' => '{account}.myapp.com'], function () {
    Route::get('user/{id}', function ($account, $id) {
        //
        return $account.$id;
    });
});
//路由前缀
Route::group(['prefix' => 'admin'], function () {
    Route::get('users', function () {
        // 匹配 "/admin/users" URL
    });
});

Route::get('api/users/{user}', function (App\User $user) {
    return $user->email;
});


Route::get('middleware/profile', function () {
    return 'Hello World';
})->middleware('auth');  //->middleware('auth','second')
//分配中间件的时候还可以传递完整的类名：
//->middleware(CheckAge::class);

//控制器

Route::get('user/{id}', 'Test\UserController@show');

//控制器中间件
Route::get('profile', 'UserController@show')->middleware('auth');


Route::resource('photo', 'PhotoController', ['only' =>
    ['index', 'show']
]);

Route::resource('photo', 'PhotoController', ['except' =>
    ['create', 'store', 'update', 'destroy']
]);

Route::resource('photo', 'PhotoController', ['names' =>
    ['create' => 'photo.build']
]);

Route::resource('user', 'AdminUserController', ['parameters' => [
    'user' => 'admin_user'
]]);

/*
 * 补充资源控制器

如果有必要在默认资源路由之外添加额外的路由到资源控制器，应该在调用 Route::resource 之前定义这些路由；
否则，通过 resource 方法定义的路由可能无意中优先于补充的额外路由：

Route::get('photos/popular', 'PhotoController@method');
Route::resource('photos', 'PhotoController');
 *
 */

//安装完这些库之后，你只需要在路由或控制器中通过对请求类型进行类型提示就可以获取 PSR-7 请求：

use Psr\Http\Message\ServerRequestInterface;

Route::get('/psr7', function (ServerRequestInterface $request) {
    //
});





